package br.com.monise.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import br.com.monise.dao.AprendizDAO;
import br.com.monise.dao.CaracteristicasAprendizDAO;
import br.com.monise.dao.CaracteristicasDAO;
import br.com.monise.model.Aprendiz;
import br.com.monise.model.Caracteristicas;
import br.com.monise.model.CaracteristicasAprendiz;

public class Similaridade {
	
	private Logger log;
	private String pulaLinha = "\n";
	private CaracteristicasDAO caracteristicasDao = new CaracteristicasDAO();
	private CaracteristicasAprendizDAO caracteristicaAprendizDao = new CaracteristicasAprendizDAO();
	
	public Similaridade(Logger log){
		this.log = log;
	}
	
	 //Verifica quem sao os aprendizes similares e retorna uma lista com os mesmos
		public List<Aprendiz> calculo(Aprendiz administrador) throws Exception {
			AprendizDAO aprendizDao = new AprendizDAO();
			List<Aprendiz> aprendizes = aprendizDao.getAll();
			List<Aprendiz> aprendizesSimilares = new ArrayList<Aprendiz>();

			for (Aprendiz aprendiz : aprendizes) {
				Aprendiz similar = new Aprendiz();

				log.info("Aprendiz: " + aprendiz.getNome() + pulaLinha);
				similar = calculoCaracteristica(aprendiz, administrador);

				if (similar != null) {
					log.info("Similar: " + similar.getNome() + pulaLinha);
					aprendizesSimilares.add(similar);
				}
			}

			return aprendizesSimilares;
		}

		private Aprendiz calculoCaracteristica(Aprendiz aprendiz, Aprendiz alvo) {
			List<Caracteristicas> caracteristicas = new ArrayList<Caracteristicas>();

			try {
				caracteristicas = caracteristicasDao.getAll();
			} catch (Exception e) {
				e.printStackTrace();
				log.warning(e.getMessage());
			}

			CaracteristicasAprendiz ctAprendiz = new CaracteristicasAprendiz();
			CaracteristicasAprendiz ctAlvo = new CaracteristicasAprendiz();

			Double soma = new Double(0);

			for (Caracteristicas caracteristica : caracteristicas) {
				BigDecimal maisPatamar = new BigDecimal(0), menosPatamar = new BigDecimal(
						0), wk = new BigDecimal(0);

				ctAprendiz = caracteristicaAprendizDao.getCaracteristicasParceiro(
						caracteristica, aprendiz);
				ctAlvo = caracteristicaAprendizDao.getCaracteristicasParceiro(
						caracteristica, alvo);

				log.info("Caracteristica: " + caracteristica.getNome());
				log.info("Margem caracteristica: "
						+ caracteristica.getMargemComparacao());

				maisPatamar = (caracteristica.getMargemComparacao().add(ctAlvo
						.getItensCaracteristicas().getValor()));
				menosPatamar = (ctAlvo.getItensCaracteristicas().getValor()
						.subtract(caracteristica.getMargemComparacao()));

				log.info("Maior patamar : " + maisPatamar);
				log.info("Menos patamar : " + menosPatamar);

				log.info("valor caract. aprendiz alvo: "
						+ ctAlvo.getItensCaracteristicas().getValor());
				log.info("valor caract. aprendiz: "
						+ ctAprendiz.getItensCaracteristicas().getValor());

				if (ctAlvo.getItensCaracteristicas().getValor()
						.compareTo(ctAprendiz.getItensCaracteristicas().getValor()) == 0) {
					wk = new BigDecimal(1);
					log.info("WK igual " + wk);
				} else if (((ctAprendiz.getItensCaracteristicas().getValor()
						.compareTo(menosPatamar)) >= 0)
						|| ((ctAprendiz.getItensCaracteristicas().getValor()
								.compareTo(maisPatamar)) <= 0)) {

					if ((ctAprendiz.getItensCaracteristicas().getValor()
							.compareTo(ctAlvo.getItensCaracteristicas()
									.getValor())) <= -1) {
						wk = ctAprendiz.getItensCaracteristicas().getValor();
						log.info("WK menor valor aprendiz " + wk);
					} else {
						wk = ctAlvo.getItensCaracteristicas().getValor();
						log.info("WK patamar valor aprendiz alvo " + wk);
					}
				} else {
					wk = new BigDecimal(0);
					log.info("WK diferente " + wk);
				}

				log.info(pulaLinha);
				wk = wk.multiply(caracteristica.getPeso());
				log.info("Valor soma: " + wk.doubleValue());
				soma = soma + wk.doubleValue();
			}

			BigDecimal novo = alvo.getPatamarUsuario();
			novo = novo.subtract(new BigDecimal(0.75));

			log.info("Soma " + soma.doubleValue());
			log.info("Patamar de similaridade ADM: " + alvo.getPatamarUsuario());

			if (soma >= alvo.getPatamarUsuario().doubleValue()) {
				return aprendiz;
			} else {
				return null;
			}
		}

}
